package com.dunke.utils;

import com.dunke.core.common.TokenData;
import com.dunke.constants.Constants;
import com.dunke.constants.RedisConstant;
import com.google.gson.Gson;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import org.apache.commons.lang3.StringUtils;

/**
 * Jedis 工具类
 */
public class JedisUtil {

    private static Jedis jedis;

    private static final JedisPool pool;

    /**
     * 静态代码块只执行一次
     */
    static {
        JedisPoolConfig poolConfig = new JedisPoolConfig();
        poolConfig.setMaxTotal(RedisConstant.MAX_ACTIVE);
        poolConfig.setMaxIdle(RedisConstant.MAX_IDLE);
        poolConfig.setMaxWaitMillis(RedisConstant.MAX_WAIT);
        poolConfig.setMinIdle(RedisConstant.MIN_IDLE);
        pool = new JedisPool(poolConfig, RedisConstant.HOST, RedisConstant.PORT);
//        , RedisConstant.TIMEOUT, RedisConstant.PASSWORD, RedisConstant.DATABASE);
    }

    public static void main(String[] args) {
        JedisUtil jedisUtil = new JedisUtil();
//        jedisUtil.set("1", "123213").close();
        TokenData tokenData = jedisUtil.getToken("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhdWQiOiJhZG1pbiIsImV4cCI6MTYyNjY5NzU3NCwiaWF0IjoxNjI2MDkyNzc0fQ.YX_5XTKTfP8pDjy52tU2w8RuvxtWSbDVCtk_ufanxrU");

        System.out.println(tokenData == null ? "未获取" : tokenData.getAccount());
    }

    /**
     * jedis 是否为空
     * @return
     */
    public boolean isExist() {
        if (jedis == null) {
            if (pool != null) {
                jedis = pool.getResource();
                return true;
            }
            return false;
        }
        return true;
    }

    /**
     * 存储键值对
     * @param key
     * @param value
     * @return
     */
    public JedisUtil set(String key, String value) {
        if (isExist()) {
            jedis.set(key, value);
            close();
        }
        return this;
    }

    /**
     * 存储token对象(也可用于时间更新)
     * @param tokenData
     * @return
     */
    public JedisUtil setToken(TokenData tokenData) {
        if (delete(tokenData.getToken())) {
            // NX是不存在时才set， XX是存在时才set， EX是秒，PX是毫秒
//            jedis.set(tokenData.getToken(), new Gson().toJson(tokenData),
//                   "NX", "EX", Constants.TOKEN_EXPIRE_TIME);
//            jedis.set(tokenData.getToken(), new Gson().toJson(tokenData));
//            jedis.expire(tokenData.getToken(), 10);
            // key, 过期时间, value
            jedis.psetex(tokenData.getToken(), Constants.TOKEN_EXPIRE_TIME,
                    new Gson().toJson(tokenData));
            close();
        }
        return this;
    }

    /**
     * 指定的Key是否存在
     * @param key
     * @return
     */
    public boolean isKey(String key) {
        if (isExist()) {
            return jedis.exists(key);
        }
        return false;
    }

    /**
     * 获取指定键的值
     * @param key
     * @return
     */
    public String get(String key) {
        if (isKey(key)) {
            String value = jedis.get(key);
            close();
            return value;
        }
        close();
        return null;
    }

    /**
     * 获取Token中的用户账号
     * @param key
     * @return 用户Id
     */
    public String getTokenAccount(String key) {
        TokenData token = getToken(key);
        if (token == null) {
            return null;
        }
        return token.getAccount();
    }

    /**
     * 获取Token中的用户Id
     * @param key
     * @return 用户Id
     */
    public int getTokenId(String key) {
        TokenData token = getToken(key);
        if (token == null) {
            return 0;
        }
        return token.getId();

    }

    /**
     * 获取Token
     * @param key
     * @return
     */
    public TokenData getToken(String key) {
        if (isKey(key)) {
            String token = jedis.get(key);
            close();
            if (!StringUtils.isBlank(token))
                return new Gson().fromJson(token, TokenData.class);
        }
        return null;
    }

    /**
     * 删除指定的Key
     * @param key
     * @return
     */
    public boolean delete(String key) {
        if (isKey(key)) {
            boolean is = (jedis.del(key) == 1);
            close();
            return is;
        }
        close();
        return true;
    }

    /**
     * 释放资源
     * 释放连接对象
     * @return
     */
    public JedisUtil close() {
        if (jedis != null) {
            jedis.close();
        }
        return this;
    }

    /**
     * 释放连接池对象
     * @return
     */
    public JedisUtil closePool(){
        if (pool != null)
            pool.close();
        return this;
    }
}
